package org.itboys.commons.utils.http;

import com.alibaba.fastjson.JSON;
import com.squareup.okhttp.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

/**
 * 包名：com.hz.sunday.xlcl.controller.web
 * 作者 : 江雄
 * Email: empty90911@126.com
 * 时间：2015年10月8日 下午3:47:21
 * 描述:圣代_微信_okhttp_协议工具
 *
 */
public class OkHttpUtil {
    protected Logger logger = LoggerFactory.getLogger(getClass());

    public static final MediaType JSON_MediaType= MediaType.parse("application/json; charset=utf-8");
    /**
     * post请求传递json
     * @param url
     * @return map
     */
    public static Map<String,Object> doPostWithJson(String url,String json){
        OkHttpClient client = new OkHttpClient();
        //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
        System.out.println("-post请求传递URL-"+url);
        System.out.println("-post请求传递json参数-"+json);
        RequestBody requestBody = RequestBody.create(JSON_MediaType, json);
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();
        try {
            Response response = client.newCall(request).execute();
            /**
             * 我们在调试的时候喜欢Log一下看看数据正不正常，我在使用HttpURLConnection  或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析，没有出现这样的问题；但是在使用OKhttp时就不正常了，因为调用了一次response.body().string()，那么这个流就已经被关闭了。所以想要Log，又要解析的时候，解决的办法是
             暂存一下这个数据：String tempResponse =  response.body().string();然后使用这个暂存的数据tempResponse 。
             */
            String  response_body =response.body().string();
          //  return response_body;
           // String response_body_utf8 = URLEncoder.encode(response_body, "UTF-8");
            System.out.println("-post请求传递json返回结果-"+response_body);
           // Map<String,Object> result = JsonUtils.jsonToObject(Map.class,json);
            Map<String,Object> result= JSON.parseObject(response_body,Map.class);
           /* System.out.println("-post请求传递MAP返回结果-"+result.size());
            for(String key:result.keySet()){
                System.out.println("-post请求返回Map,key=-"+key+",value="+result.get(key));
            }*/
            return result;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * get方式
     * @param url
     * @return
     */
    public static Map<String,Object> doGet(String url){
        OkHttpClient client = new OkHttpClient();
        //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
        System.out.println("-get请求传递URL-"+url);

        Request request = new Request.Builder()
                .url(url)
                .build();
        try {
            Response response = client.newCall(request).execute();
            /**
             * 我们在调试的时候喜欢Log一下看看数据正不正常，我在使用HttpURLConnection  或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析，没有出现这样的问题；但是在使用OKhttp时就不正常了，因为调用了一次response.body().string()，那么这个流就已经被关闭了。所以想要Log，又要解析的时候，解决的办法是
             暂存一下这个数据：String tempResponse =  response.body().string();然后使用这个暂存的数据tempResponse 。
             */
            String  response_body =response.body().string();
            //  return response_body;
            // String response_body_utf8 = URLEncoder.encode(response_body, "UTF-8");
            System.out.println("-post请求传递json返回结果-"+response_body);
            // Map<String,Object> result = JsonUtils.jsonToObject(Map.class,json);
            Map<String,Object> result= JSON.parseObject(response_body,Map.class);
           /* System.out.println("-post请求传递MAP返回结果-"+result.size());
            for(String key:result.keySet()){
                System.out.println("-post请求返回Map,key=-"+key+",value="+result.get(key));
            }*/
            return result;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public static Map<String,Object> doGetWithHeader(String url,String appCode){
        OkHttpClient client = new OkHttpClient();
        //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
        System.out.println("get请求传递URL-"+url+"                 headerKey="+appCode);

        Request request = new Request.Builder()
                .url(url)
                .header("Authorization","APPCODE "+appCode)
                .build();
        try {
            Response response = client.newCall(request).execute();
            /**
             * 我们在调试的时候喜欢Log一下看看数据正不正常，我在使用HttpURLConnection  或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析，没有出现这样的问题；但是在使用OKhttp时就不正常了，因为调用了一次response.body().string()，那么这个流就已经被关闭了。所以想要Log，又要解析的时候，解决的办法是
             暂存一下这个数据：String tempResponse =  response.body().string();然后使用这个暂存的数据tempResponse 。
             */
            String  response_body =response.body().string();
            //  return response_body;
            // String response_body_utf8 = URLEncoder.encode(response_body, "UTF-8");
            System.out.println("-post请求传递json返回结果-"+response_body);
            // Map<String,Object> result = JsonUtils.jsonToObject(Map.class,json);
            Map<String,Object> result= JSON.parseObject(response_body,Map.class);
           /* System.out.println("-post请求传递MAP返回结果-"+result.size());
            for(String key:result.keySet()){
                System.out.println("-post请求返回Map,key=-"+key+",value="+result.get(key));
            }*/
            return result;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
